package kgame5.k3d.core.camera {
import kgame5.k3d.core.math.Matrix3D;
import kgame5.k3d.core.math.Vector3D;

/**
 * @author kangkai
 * 默认摄像机是在(0,0,-900),视点的位置是(0,0,0)
 * TODO 这个最好是个单例
 */
public class Camera3D {
	//________________________Static_______________________
	
	private static const V3D_UP:Vector3D=new Vector3D(0,1,0);
	
	//________________________Property________________________
	//
	public var eyePosi:Vector3D;
	public var aimPosi:Vector3D;
	
	//这个是记录上一真的眼睛和目标的位置，如果位置没发生变化，则不需要重新计算Mc矩阵（）
	private var preEye:Vector3D;
	private var preAim:Vector3D;
	//
	
	//这个矩阵负责把世界坐标系里的一点转换到摄象机坐标系去
	public var Mwc:Matrix3D;//w-c的变换矩阵,Mw~Mc即可
	
	//保存是否摄像机变动了
	public var isDirty:Boolean=true;//isMwcChanged:Boolean=true;
	
	//_______________________Method__________________________
	public function Camera3D(){
		
		eyePosi=new Vector3D(0,0,-900);
		aimPosi=new Vector3D(0,0,0);
		
		preEye=new Vector3D(0,0,0);
		preAim=new Vector3D(0,0,0);
		
		Mwc=new Matrix3D();
		 
	}
	
	//返回的是isMcChanged,//true表示Mc变了，false表示位置没变。
	private function calcMwc():Boolean{
		if(preEye.isEqual(eyePosi)&&preAim.isEqual(aimPosi)){//位置没变不需要重新计算
			//T.p("Mc没改变");
			return false;
		}else{//位置变了需要重新计算
			Mwc.setupCameraLookAt(eyePosi,aimPosi,V3D_UP);
			//位置变了则保存上一次的位置
			preEye.copy(eyePosi);
			preAim.copy(aimPosi);
			//T.p("Mc改变");
			return true;
		}
	}
	
	public function Update():void {
		isDirty=calcMwc();//很关键的逻辑，计算是Mwc
	}
	
}//end of class
}
